package org.ala.tiktools.rocketmq.annotations;

import org.ala.tiktools.rocketmq.Namespace;
import org.ala.tiktools.rocketmq.producer.queue.DefaultQueueSelecter;
import org.ala.tiktools.rocketmq.producer.queue.IQueueSelecter;
import org.ala.tiktools.rocketmq.producer.transaction.DefaultTransactionListener;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.springframework.stereotype.Component;

import java.lang.annotation.*;


/**
 * ProducerService下的每个ProducerMethod注解方法，会生成一个Producer
 * ProducerMethod无论如何都会返回null
 *
 * @author ala
 * @date 2024-12-05 11:12
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ProducerMethod {


    /**
     *  消费组
     *  <p> 如果不为NULL，Service类下的默认group
     */
    String group() default Namespace.DEFAULT_GROUP;
    /**
     *  topic
     *  <p> 如果不为NULL，Service类下的默认topic
     */
    String topic() default Namespace.NULL;
    /**
     *  tag
     */
    String tag() default Namespace.NULL;


    /**
     *  队列选择器
     *  <p> 会根据class到bean池里找bean，找不到会new一个。所以需要无参构造函数
     */
    Class<? extends IQueueSelecter> queueSelector() default DefaultQueueSelecter.class;
    /**
     *  事务回调
     *  <p> 会根据class到bean池里找bean，找不到会new一个。所以需要无参构造函数
     */
    Class<? extends TransactionListener> transaction() default DefaultTransactionListener.class;

    /**
     *  默认队列数
     *  <p> 只在初始化时有效，有可能后期被控制台修改
     */
    int defaultQueueNum() default Namespace.INF;
}
